#include<bits/stdc++.h>
#define RI register int
using namespace std;

class bnum
{
	private:
		int *len,size;
		bool *f;
		char *dat;
	public:
		void init(){dat=new char[size+1];len=new int;f=new bool;memset(dat,'0',sizeof (*dat));(*f)=1;(*len)=0;}
		void del(){delete[] dat;delete len;delete f;}
		void reset(){del();init();}
		
		bnum(int siz=1001):size(siz){init();}
		bnum(const long long a,int siz=1001);
		bnum(const char * a,int siz=1001);
		bnum(const bnum &a,int siz=1001);
		bnum operator=(bnum  a);
		~bnum(){del();}
		
		void print();
		friend ostream & operator<<(ostream & out,bnum & a);
		friend istream & operator>>(istream & in,bnum & a);
		
		
		bnum  operator+(const bnum & a)const;
		bnum & operator+=(const bnum & a);
		bnum  operator-(const bnum & a)const;
		bnum & operator-=(const bnum & a);
		bnum  operator*(const bnum & a)const;
		bnum & operator*=(const bnum & a);
		bnum  operator/(const bnum & a)const;
		bnum & operator/=(const bnum & a);
		bnum  operator%(const bnum & a)const;
		bnum & operator%=(const bnum & a);
		
		bool operator>(bnum & a)const;
		bool operator<(bnum & a)const;
		bool operator>=(bnum & a)const;
		bool operator<=(bnum & a)const;
		bool operator==(bnum & a)const;
		
		bnum & operator<<(bnum & a)const;
		bnum & operator>>(bnum & a)const;
		bnum & operator<<=(bnum & a);
		bnum & operator>>=(bnum & a);
		
		bnum & operator&(bnum & a)const;
		bnum & operator|(bnum & a)const;
		bnum & operator^(bnum & a)const;
		bnum & operator~()const;
		
		int operator[](int & a)const{return dat[size-a+1]-'0';}
		
		bnum & sqrt(bnum & a)const;
		bnum & pow(bnum & a)const;
		
		int getlen()const{return (*len)+1;}
		
};
bnum::bnum(long long a,int siz):size(siz)
{
	init();
	if(a<0) a=-a,f=0;
	while(a)
	{
		dat[(*len)++]=(a%10)+'0';
		a/=10;
	}
}
bnum::bnum(const char * a,int siz):size(siz)
{
	init();
	(*len)=strlen(a)-1;
	if(a[0]=='-')
	{
		f=0;
		for(RI i=1;i<=(*len);i++) dat[i]=a[i];
	}
	else for(RI i=0;i<=(*len);i++) dat[i]=a[i];
}
bnum::bnum(const bnum & a,int siz):size(siz)
{
	init();
	(*f)=(*a.f);(*len)=(*a.len);
	for(RI i=0;i<=(*len);i++)
		dat[i]=a.dat[i];
}
bnum bnum::operator=(bnum a)
{
	reset();
	(*f)=(*a.f);(*len)=(*a.len);
		for(RI i=0;i<=(*len);i++)
			dat[i]=a.dat[i];
	return *this;
}
void bnum::print()
{
	if(!f) printf("-");
	for(RI i=(*len);i>=0;i--) 
		printf("%c",dat[i]);
}
ostream & operator<<(ostream & out,bnum & a)
{
	a.print();
	return out;
}
istream & operator>>(istream & in,bnum & a)
{
	string tmp;
	getline(in,tmp);
	bnum ttmp(tmp.c_str());
	a=ttmp;
	return in;
}
bnum bnum::operator+(const bnum & a)const
{
	bnum res(*this);
	(*len)=max((*len),(*a.len));
	int tmp=0;
	for(RI i=0;i<=(*len);i++)
	{
		tmp=dat[i]-'0'-'0'+a.dat[i];
		if(tmp>9)
		{
			if(i==(*len)) (*len)++;
			res.dat[i+1]++;
		}	
		res.dat[i]+=tmp;
	}
	return res;
}
bnum & bnum::operator+=(const bnum & a)
{
	(*this)=((*this)+a);
	return (*this);
}
bnum  bnum::operator-(const bnum & a)const
{
	
}